﻿using System;
using LayerEntity.Persona;
using LayerEntity.Persona.RecursosHumanos;

namespace System2012.Persona.Empleados
{
    public partial class Empleado : DevExpress.XtraEditors.XtraForm
    {
        #region Variables
        IEPersona emp = ObjectFactoryPersona.CreateEmployee ();
        bool faltaSetear = false;
        public LayerLogic.EnumOperaciones Operacion { get; set; }
        #endregion

        public Empleado()
        {
            this.InitializeComponent();
            //this.WindowState = FormWindowState.Maximized;
        }
        public Empleado(IEPersona per) {
            this.InitializeComponent();
            emp = per;
            faltaSetear = true;
        }

        private  void SetEmpleado()
        {
            //this.emp = e;
            IEPersona e = emp;
            this.Operacion = LayerLogic.EnumOperaciones.Actualizar;
            this.TxtCodigo.EditValue = e.IdPersona;
            this.CbArea.EditValue = e.IdArea;
            this.CbCargo.EditValue = e.IdCargo;
            this.CbDocumento.EditValue = e.IdTipoDocumento;
            this.TxtNumero.EditValue = e.NumeroDocumento;
            this.TxtApellidos.EditValue = e.Apellidos;
            this.TxtNombres.EditValue = e.Nombres;
            this.TxtFechaNacimiento.EditValue = e.FechaNacimiento;
            this.TxtLugar.EditValue = e.LugarNacimiento;
            this.CbSexo.EditValue = e.Sexo;
            this.CbEstadoCivil.EditValue = e.IdEstadoCivil;
            this.CbProfesion.EditValue = e.IdProfesion;
            this.CbGradoInstruccion.EditValue = e.IdGradoInstruccion;
            this.ucDireccion1.SetDireccion(e.GetPrincipalAddress());

            EPlanilla plan = e.Planilla;
            if (plan != null)
            {
                this.chkEnPlanilla.EditValue = plan.EnPlanilla;
                this.TxtFechaIngreso.EditValue = plan.FechaIngreso;
                this.txtCuspp.EditValue = plan.Cuspp;
                this.TxtEssalud.EditValue = plan.Essalud;
                this.TxtNumHijos.EditValue = plan.NumeroHijos;
                this.TxtSueldoBase.EditValue = plan.Sueldo;
                if (plan.EnPlanilla)
                {
                    EAfp af = SystemUtils.RecordManagerCommonList.GetAfp((long) plan.IdAfp);
                    if (af != null)
                    {
                        this.CbSistema.EditValue = af.Tipo;
                        this.CbAfp.EditValue = af.IdAfp;
                        this.TxtFechaInscripcion.EditValue = plan.FechaInscripcion;
                        if (plan.IdEstado != 1)
                        {
                            this.TxtFechaCese.EditValue = plan.FechaCese;
                        }
                    }
                }
            }
            else
            {
                this.chkEnPlanilla.Checked = false;
            }
            
            ECuentasCorrientes csueldo = e.GetSueldoAccount();
            if (csueldo != null)
            {
                this.chkCuentaSueldo.Checked = true;
                this.ucCuentaCorriente1.SetCuentaCorriente(csueldo);
            }
            else
            {
                this.ucCuentaCorriente1.NuevaCuenta();
                this.chkCuentaSueldo.Checked = false ;
            }
            ECuentasCorrientes cts = e.GetCtsAccount();
            if (cts != null)
            {
                this.ucCuentaCorriente2.SetCuentaCorriente(cts);
                this.chkCuentaCts.Checked = true;
            }
            else
            {
                this.ucCuentaCorriente2.NuevaCuenta();
                this.chkCuentaCts.Checked = false;
            }
        }

        internal void NuevoEmpleado()
        {
            this.Operacion = LayerLogic.EnumOperaciones.Insertar;
            this.ucDireccion1.NewAddress();
            this.TxtCodigo.EditValue = string.Empty; 
            this.pictureEdit1.EditValue = null;
            this.TxtApellidos.EditValue = string.Empty;
            this.TxtNombres.EditValue = string.Empty;
            this.TxtLugar.EditValue = string.Empty;
            this.TxtFechaNacimiento.EditValue = DateTime.Now.Date;
            this.TxtFechaIngreso.EditValue = DateTime.Now.Date;
            this.TxtNumHijos.EditValue = 0;
            this.TxtSueldoBase.EditValue = "0.00";
            this.txtCuspp.EditValue = string.Empty;
            this.TxtEssalud.EditValue = string.Empty;
            this.TxtFechaInscripcion.EditValue = null;
            this.TxtFechaCese.EditValue = null;
            this.ucCuentaCorriente1.NuevaCuenta();
            this.ucCuentaCorriente2.NuevaCuenta();
        }

        #region Metodos

        private void AddDataSource(DevExpress.XtraEditors.LookUpEdit lkedit, object source)
        {
            lkedit.Properties.DataSource = source;
            if (this.intEstatusCarga < 9)
            {
                this.intEstatusCarga += 1;
                this.BGWLoadList.RunWorkerAsync();
            }
        }

        private void Save()
        {
            if (this.CbArea.EditValue == null)
            {
                SystemUtils.AlerMessaje("Seleccione una Area");
                this.CbArea.Focus();
                return;
            }
            if (this.CbCargo.EditValue == null)
            {
                SystemUtils.AlerMessaje("Seleccione uno Cargo");
                this.CbCargo.Focus();
                return;
            }
            if (this.CbDocumento.EditValue == null)
            {
                SystemUtils.AlerMessaje("Seleccione un Tipo de Documento");
                this.CbDocumento.Focus();
                return;
            }
            if (this.TxtNumero.EditValue.ToString() == string.Empty)
            {
                SystemUtils.AlerMessaje("Ingrese el Numero de Documento");
                this.TxtNumero.Focus();
                return;
            }

            if (this.TxtNombres.EditValue.ToString().Trim() == string.Empty)
            {
                SystemUtils.AlerMessaje("Ingrese el Nombre del Empleado");
                this.TxtNombres.Focus();
                return;
            }

            if (this.TxtApellidos.EditValue.ToString().Trim() == string.Empty)
            {
                SystemUtils.AlerMessaje("Ingrese Apellidos del Empleado");
                this.TxtApellidos.Focus();
                return;
            }

            if (this.CbSexo.EditValue == null)
            {
                SystemUtils.AlerMessaje("Seleccione el Sexo del Empleado");
                this.CbSexo.Focus();
                return;
            }

            if (this.CbEstadoCivil.EditValue == null)
            {
                SystemUtils.AlerMessaje("Seleccione el estado Civil del Empleado");
                this.CbEstadoCivil.Focus();
                return;
            }

            if (this.CbProfesion.EditValue == null)
            {
                SystemUtils.AlerMessaje("Seleccione una Profesion");
                this.CbProfesion.Focus();
                return;
            }

            if (this.CbGradoInstruccion.EditValue == null)
            {
                SystemUtils.AlerMessaje("Seleccione un Grado de Instruccion");
                this.CbGradoInstruccion.Focus();
                return;
            }

            EDireccion dir = this.ucDireccion1.GetDireccion();

            if (dir == null)
            {
                return;
            }

            IEPersona empl = ObjectFactoryPersona .CreateEmployee ();
            if (this.Operacion == LayerLogic.EnumOperaciones.Actualizar)
            {
                empl = SystemUtils.RecordManagerPersona.GetEmployee(this.TxtCodigo.EditValue.ToString().Trim());
                if (empl == null)
                {
                    empl = ObjectFactoryPersona.CreateEmployee ();
                }
            }

            EPlanilla plan = empl.Planilla;
            if (this.chkEnPlanilla.Checked)
            {
                if (this.CbSistema.EditValue == null)
                {
                    SystemUtils.AlerMessaje("Seleccione un Sistema de Pension");
                    this.CbSistema.Focus();
                    return;
                }

                if (this.CbAfp.EditValue == null)
                {
                    SystemUtils.AlerMessaje("Seleccione una Administrador de Fondes de Pensiones");
                    this.CbAfp.Focus();
                    return;
                }
                plan.EnPlanilla = true;
                plan.IdAfp = Convert.ToInt32(this.CbAfp.EditValue.ToString()) ;
                plan.FechaInscripcion = (DateTime) this.TxtFechaIngreso.EditValue;
            }
            else
            {
                plan.EnPlanilla = false;
                plan.IdAfp = 0;
                plan.FechaInscripcion = DateTime.Now;
            }

            if (this.TxtFechaCese.EditValue != null)
            {
                plan.FechaCese = (DateTime ) this.TxtFechaCese.EditValue;
            }

            ECuentasCorrientes csueldo = null;
            if (this.chkCuentaSueldo.Checked)
            {
                csueldo = this.ucCuentaCorriente1.GetCuentaCorriente();
                if (csueldo == null)
                {
                    return;
                }
            }

            ECuentasCorrientes ctd = null;

            if (this.chkCuentaCts.Checked)
            {
                ctd = this.ucCuentaCorriente2.GetCuentaCorriente();
                if (ctd == null)
                {
                    return;
                }
            }

            empl.Apellidos = this.TxtApellidos.EditValue.ToString();
            empl.FechaNacimiento = Convert.ToDateTime(this.TxtFechaNacimiento.EditValue.ToString());
            empl.IdArea = (int)this.CbArea.EditValue;
            empl.IdCargo = (int)this.CbCargo.EditValue;
            empl.IdEstado = 1;
            empl.IdEstadoCivil = (int)this.CbEstadoCivil.EditValue;
            empl.IdGradoInstruccion = (int)this.CbGradoInstruccion.EditValue;

            if (this.Operacion == LayerLogic.EnumOperaciones.Insertar)
            {
                empl.IdPersona = "";
                empl.TipoPersonaSistema = "0010000000000";
            }
            else
            {
                empl.IdPersona = this.TxtCodigo.EditValue.ToString();
                empl.TipoPersonaSistema = this.emp.TipoPersonaSistema;
            }
            empl.IdProfesion = (int)this.CbProfesion.EditValue;
            empl.IdTipoDocumento = (int)this.CbDocumento.EditValue;
            empl.LugarNacimiento = this.TxtLugar.EditValue.ToString();
            empl.Nombres = this.TxtNombres.EditValue.ToString();
            empl.NumeroDocumento = this.TxtNumero.EditValue.ToString();
            empl.Observacion = "";
            empl.Sexo = (int)this.CbSexo.EditValue;
            empl.FullName = string.Concat(empl.Apellidos, ", ", empl.Nombres);
            string resultado = SystemUtils.RecordManagerPersona.SaveEmpleado(empl, this.Operacion);
            if (resultado != null)
            {
                resultado = resultado.Trim();
                if (string.IsNullOrEmpty(resultado))
                {
                    SystemUtils.AlerMessaje("Error al Registrar Empleado");
                    return;
                }
                empl.IdPersona = resultado;

                dir.IdPersona = resultado;
                dir.IsPrincipal = true;

                int idDir = SystemUtils.RecordManagerPersona.SaveAddress(dir, this.ucDireccion1.Operacion);
                if (idDir > 0)
                {
                    dir.Item = idDir;
                    empl.AddAddressInfo(dir);
                }
                else
                {
                    SystemUtils.AlerMessaje("Error al Registrar al Direccion PrincipalSe Cancelara el Registro de los Demas Datos.");
                    return;
                }

                /*aki guardamos la info de planilla registrada*/
                plan.Cuspp = this.txtCuspp.EditValue.ToString();
                plan.Essalud = this.TxtEssalud.EditValue.ToString();
                plan.FechaIngreso = (DateTime)this.TxtFechaIngreso.EditValue;
                plan.IdEstado = 1;
                plan.NumeroHijos = Convert.ToInt32(this.TxtNumHijos.Text);
                plan.Sueldo = Convert.ToDouble(this.TxtSueldoBase.EditValue.ToString());

                plan.IdPersona = resultado.Trim();
                int idplan = SystemUtils.RecordManagerPersona.SavePlanilla(plan);

                if (idplan > 0)
                {
                    plan.IdPlanilla = idplan;
                }

                if (csueldo != null)
                {
                    csueldo.IdTipoCtaCte = 1;//cuenta sueldo
                    csueldo.IdPersona = resultado;
                    int idCSueldo = SystemUtils.RecordManagerPersona.SaveAccount(csueldo, this.ucCuentaCorriente1.Operacion);
                    if (idCSueldo > 0)
                    {
                        csueldo.IdCtaCte = idCSueldo;
                        empl.AddAccountInfo(csueldo);
                    }
                    else
                    {
                        SystemUtils.AlerMessaje("Error al registrar la Cuenta Sueldo");
                        return;
                    }
                }
                else
                {
                    empl.RemoveAccountInfo(empl.GetSueldoAccount());
                }
                if (ctd != null)
                {
                    ctd.IdTipoCtaCte = 2;//cuenta cts 
                    ctd.IdPersona = resultado;
                    int idCts = SystemUtils.RecordManagerPersona.SaveAccount(ctd, this.ucCuentaCorriente2.Operacion);
                    if (idCts > 0)
                    {
                        ctd.IdCtaCte = idCts;
                        empl.AddAccountInfo(ctd);
                    }
                    else
                    {
                        SystemUtils.AlerMessaje("Error al registrar la Cuenta CTS");
                        return;
                    }
                }
                else
                {
                    empl.RemoveAccountInfo(empl.GetCtsAccount());
                }

                SystemUtils.RecordManagerPersona.AddEmpleado(empl);

                SystemUtils.InformationMessaje("Empleado Registrado");
                this.Close();
            }
        }

        #endregion

        #region Proceso Backgound
        /// <summary>
        /// Permite controlar las listas que seran cargadas
        /// Valores: 
        /// 1.- Areas
        /// 2.- Cargos
        /// 3.- Documentos
        /// 4.- Sexo
        /// 5.- Estado Civil
        /// 6.- Profesion
        /// 7.- Grado de Instruccion
        /// 8.- Afps
        /// 9.- Sistemas de Pensiones
        /// </summary>
        int intEstatusCarga = 1;
        private void BgwLoadListDoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            this.BGWLoadList.ReportProgress(20, "Iniciando Carga");
            if (this.intEstatusCarga == 9)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetSistemaPension();
            }
            if (this.intEstatusCarga == 8)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetAfp(2);
            }
            if (this.intEstatusCarga == 7)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetGradoInstruccion();
            }
            if (this.intEstatusCarga == 6)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetProfesion();
            }
            if (this.intEstatusCarga == 5)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetEstadoCivil();
            }
            if (this.intEstatusCarga == 4)
            {
                e.Result = SystemUtils.RecordManagerPersona.GetSexos();
            }
            if (this.intEstatusCarga == 3)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetDocument(0);
            }
            if (this.intEstatusCarga == 2)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetCargos();
            }
            if (this.intEstatusCarga == 1)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetAreas();
            }
            this.BGWLoadList.ReportProgress(100, "Load Complete");
        }

        private void BgwLoadListRunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            if (this.intEstatusCarga == 9)
            {
                this.AddDataSource(this.CbSistema, e.Result);
                if (faltaSetear)
                {
                    if (emp != null)
                    {
                        SetEmpleado();
                    }
                }
            }
            if (this.intEstatusCarga == 8)
            {
                this.AddDataSource(this.CbAfp, e.Result);
            }
            if (this.intEstatusCarga == 7)
            {
                this.AddDataSource(this.CbGradoInstruccion, e.Result);
            }
            if (this.intEstatusCarga == 6)
            {
                this.AddDataSource(this.CbProfesion, e.Result);
            }
            if (this.intEstatusCarga == 5)
            {
                this.AddDataSource(this.CbEstadoCivil, e.Result);
            }
            if (this.intEstatusCarga == 4)
            {
                this.AddDataSource(this.CbSexo, e.Result);
            }
            if (this.intEstatusCarga == 3)
            {
                this.AddDataSource(this.CbDocumento, e.Result);
            }
            if (this.intEstatusCarga == 2)
            {
                this.AddDataSource(this.CbCargo, e.Result);
            }
            if (this.intEstatusCarga == 1)
            {
                this.AddDataSource(this.CbArea, e.Result);
            }
        }
        
        private void BgwLoadListProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {
            this.barEditItem1.EditValue = e.ProgressPercentage;
            this.barEditItem1.Caption = e.UserState.ToString();
        }

        #endregion

        private void Empleado_Load(object sender, EventArgs e)
        {
            this.ucCuentaCorriente1.LoadMoneda();
            this.ucCuentaCorriente2.LoadMoneda();
            this.BGWLoadList.RunWorkerAsync();
            this.TxtFechaIngreso.EditValue = DateTime.Now.Date;
            this.TxtFechaNacimiento.EditValue = DateTime.Now.Date;
            this.TxtFechaInscripcion.EditValue = DateTime.Now.Date;
        }

        private void CambiandoSistema(object sender, EventArgs e)
        {
            if (this.CbSistema.EditValue != null)
            {
                this.CbAfp.Properties.DataSource = SystemUtils.RecordManagerCommonList.GetAfp((int) this.CbSistema.EditValue);
            }
        }

        private void ItemClickAction(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if ((string)e.Item.Tag == "Guardar")
            {
                this.Save();
            }
        }

        private void ChkEnPlanillaCheckedChanged(object sender, EventArgs e)
        {
            this.CbSistema.Enabled = this.chkEnPlanilla.Checked;
            this.CbAfp.Enabled = this.chkEnPlanilla.Checked;
            this.TxtFechaInscripcion.EditValue = "";
            this.TxtFechaInscripcion.Enabled = this.chkEnPlanilla.Checked;
        }

        private void ChkCuentaSueldoCheckedChanged(object sender, EventArgs e)
        {
            this.ucCuentaCorriente1.Enabled = this.chkCuentaSueldo.Checked;
            if (!this.chkCuentaSueldo.Checked)
            {
                this.ucCuentaCorriente1.NuevaCuenta();
            }
        }

        private void ChkCuentaCtsCheckedChanged(object sender, EventArgs e)
        {
            this.ucCuentaCorriente2.Enabled = this.chkCuentaCts.Checked;
            if (!this.chkCuentaCts.Checked)
            {
                this.ucCuentaCorriente2.NuevaCuenta();
            }
        }

        private void TxtSueldoBase_Spin(object sender, DevExpress.XtraEditors.Controls.SpinEventArgs e)
        {
            e.Handled = true ;
        }

        private void PresionandoTeclas(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            
            if (sender == CbAfp || sender == CbArea || sender == CbCargo ||
                sender == CbDocumento || sender == CbEstadoCivil || sender == CbGradoInstruccion ||
                sender == CbProfesion || sender == CbSexo || sender == CbSistema)
            {
                if (e.KeyCode == System.Windows.Forms.Keys.Enter) {
                    System.Windows.Forms.SendKeys.Send("{TAB}");
                }
                if (e.KeyCode == System.Windows.Forms.Keys.Up)
                {
                    SelectNextControl((System.Windows.Forms.Control )sender, false, true, true, true);
                }
            }
            else {
                if (e.KeyCode == System.Windows.Forms.Keys.Down || e.KeyCode == System.Windows.Forms.Keys.Enter)
                {
                   // SelectNextControl(this.ActiveControl, true , true, true, true);
                    System.Windows.Forms.SendKeys.Send("{TAB}");
                }
                if (e.KeyCode == System.Windows.Forms.Keys.Up)
                {
                    SelectNextControl((System.Windows.Forms.Control)sender, false, true, true, true);
                }
            }
            
        }
    }
}